iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
0

Process 的基本概念

前面有提到,當我們起一個Process起來,不論是透過滑鼠左鍵連點、先框起來再按Enter、或者是比較高級的用command line去執行,是把存在硬碟裡的Program載入到硬碟中,這個時候的狀態叫作-New。在這個時候,以CPU的角度來看,Process也已經不是Process,而只是一堆Instructions。

如果有興趣的話可以在command line下指令來看看自己電腦當前的作業系統到底跑了那些process

  • Windows: 先按windows鍵跳出左下導覽 -> 輸入cmd + enter -> 跳出黑框框後輸入tasklist
  • MacOS : command+空白鍵跳出搜尋框 -> 輸入termial搜尋 -> 輸入 ps -el

在載入的這個過程中,作業系統會在跟記憶體要一塊空間來存Process所需要的資訊,那其中跟我這種開發者很相關的就是在程式裡面變數放的地方,會被存放在三個區塊:

  • Data Section: 全域變數會被放入到這個section,也就是因為放在這個地方,基本上無法透過程式去消滅全域變數回收記憶體空間。
  • Stack Section: stack其實是一種資料結構,就像服務生在存取盤子一樣,疊在最上層的盤子一定是最晚上放去的,但要拿的時候會是最早被拿走的。程式裡面的 Function就是這樣的一個概念,在裡面的變數皆為區域變數,通常越晚被宣告出來就越早被系統回收掉。
  • Heap Section: 比較低階的語言通常還會需要自己去做動態記憶體配置,動態配置的記憶體除了會放在這個區塊以外。

而Process New完之後還有幾個不同的階段

  • Running : Instructions 正在被CPU所執行。
  • Waiting : 遇到I/O,或者自己call了像是sleep的這種 system call,Prcoess進入一個在等待的階段。
  • Ready : Process已經準備好要等著被執行。
  • Terminated : Prcoess執行完結。

關於動態記憶體配置這一塊我自己有個很慘痛的經驗,過去曾寫過一套演算法,其過程是經由不斷的疊代後才能求出解,但在疊代的過程只配置記憶體,卻沒有釋放掉,於是就產生memory leadk的現象,程式把記憶體用的越來越滿,跑幾個小時之後,最後作業系統的保護機制直接送我一個大大的killed。所以說程式被殺就被殺了,還是要學好作業系統嘛,才能知道自己的程式是怎麼樣死的阿。


上一篇
Day 9 - 小節
下一篇
Day 11 - Process Control Block & Context switch
系列文
非本科系也能懂和該懂得作業系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
iT邦新手 1 級 ‧ 2019-10-03 08:55:42

嗨!剛剛發現一個小錯誤回報一下:
MacOS的指令 ps - el,多一個空格 ps -el

PotRookie iT邦新手 5 級 ‧ 2019-10-03 21:59:33 檢舉

已修正,感謝!

我要留言

立即登入留言